//
//  FYOAuthViewController.swift
//  dugeweibo
//
//  Created by pelesys on 16/8/5.
//  Copyright © 2016年 杜方宜. All rights reserved.
//
//commond + shift + j 快速回到文件焦点
//safai->偏好设置->高级->最下方 在菜单栏中显示"开发"菜单->浏览器 开发 web检查器 simulator(调试模拟器网页)
/**
 access_token:用户授权的唯一票据，用于调用微博的开放接口，同时也是第三方应用验证微博用户登录的唯一票据，第三方应用应该用该票据和自己应用内的用户建立唯一影射关系，来识别登录状态，不能使用本返回值里的UID字段来做登录识别。
 uid:授权用户的UID，本字段只是为了方便开发者，减少一次user/show接口调用而返回的，第三方应用不能用此字段作为用户登录状态的识别，只有access_token才是用户授权的唯一票据。
 client_id 申请应用时分配的AppKey。
 client_secret 申请应用时分配的AppSecret。
 grant_type 请求的类型，填写authorization_code
 grant_type为authorization_code时
 code 调用authorize获得的code值。
 redirect_uri 回调地址，需需与注册应用里的回调地址一致。
 */
/*
 拿到用户token后做用户信息的请求 用户信息接口
 access_token 采用OAuth授权方式为必填参数，OAuth授权后获得
 uid 需要查询的用户ID
 screen_name 需要查询的用户昵称。
 参数uid与screen_name二者必选其一，且只能选其一；
 
 */
import UIKit
import SVProgressHUD
import AFNetworking
//注册用模态 打断用户连续性操作用模态
class FYOAuthViewController: UIViewController {
    //定义一个webView属性
    let webView = UIWebView()
    //MARK:监听方法
    
    @objc private func close(){
        dismiss(animated: true, completion: nil)
        //背景色clear push时候跳出来可能有影响
    }
    @objc private func fullAccount(){
        //webView执行JS代码 ","分隔命令 ";"命令结束
        let jsString = "document.getElementById('userId').value = '18837150784' , document.getElementById('passwd').value = 'duge890115';"
        //执行JS代码
        webView.stringByEvaluatingJavaScript(from: jsString)
    }
    //网页授权 添加webview
    override func loadView() {
        view = webView
        webView.delegate = self
        
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        //加载网页
        loadOauthPage()
        
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        SVProgressHUD.dismiss()
    }
    private func loadOauthPage(){
        let urlString = oauthURL  + "client_id=" + client_id + "&redirect_uri=" + redirect_uri
        let url = NSURL(string: urlString)
        let requset = NSURLRequest(url: url! as URL)
        webView.loadRequest(requset as URLRequest)
    }
    private func setupUI(){
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "关闭", style: .plain, target: self, action: #selector(close))
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", style: .plain, target: self, action: #selector(fullAccount))
    }
    
}
//MARK:专门处理 webView所有的协议方法
extension FYOAuthViewController:UIWebViewDelegate{
    func webViewDidStartLoad(_ webView: UIWebView) {
        SVProgressHUD.show()
    }
    func webViewDidFinishLoad(_ webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    
    private func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        SVProgressHUD.dismiss()
    }
    
    // 当准备加载某一个页面时,会执行该方法
    // 返回值: true -> 继续加载该页面 false -> 不会加载该页面
    //协议方法  如果返回bool 一般表示 如果为true 表示当前对象可以正常工作 否则就不能
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
        
        
        //        print(request.URL)
        //absoluteString当前URL绝对路径 是个字符串
        //urlString是可选项  guard let解包
        //guard let可以减少分支嵌套
        //1.获取加载网页的NSURL
        guard let url = request.url  else{
            return true
        }
        //2.获取url中的字符串
        let urlString = url.absoluteString
        
        
        //3.判断字符串中是否包含code
        guard urlString.contains("code=")else{
            return true
        }
        
        //4.将code截取出来
        let code = urlString.components(separatedBy:"code=").last!
        //
        
        
        
        //程序走到这里  一定包含了  回到的url  走到回调url提取数据 但不能加载
        //取出code字符串 URL 中query(查询URL包含所有的参数和值 也可能会空  guard let守卫一下)
        //        guard let query = request.URL?.query else {
        //            return false
        //        }
        //        let codeStr = "code="
        //substringWithRange(aRange: Range<Index>) "<>"泛型 不建议用
        //codeStr.endIndex取到"code="之后
        //codeStr.startIndex取到包含"code="的字符串
        //  let code = query.substringFromIndex(codeStr.endIndex)
        //
        //        print(code)
        // loadAccessToken(code)
        FYUserAccountViewModel().loadAccessToken(code: code) { (error) in
            
            if error != nil{
                SVProgressHUD.showInfo(withStatus: AppErrorTip)
                return
            }
            //modal出来的页面 被dismiss掉 不会立即被回收
            //modal出来的页面 要注意dismiss
            
            //登录成功页面跳转
            self.dismiss(animated: false, completion: {
                //发出页面切换通知
                //model出来的页面 需要立即切换页面并且dismiss 需要在dismiss完成后的闭包中 开始页面的切换
                NotificationCenter.default.post(name: NSNotification.Name( AppSwitchRootViewControler), object: "Welcome")
                
                //通知是同步的
                print("come here")
            })
        }
        return false
        
    }
    
    
}
//MARK:-请求数据
extension FYOAuthViewController{
    
    // 请求AccessToken
    
    private func loadAccessToken(code:String){
        
        
        
        //    NetworkTools.shareInstance.loadAccessToken(code) { (result, error) in
        //        //1.错误检验
        //        if error != nil{
        //            print(error)
        //            result
        //        }
        //        //2.拿到结果
        //        guard let accoutDict = result else{
        //            print("没有获取授权后的数据")
        //            return
        //        }
        //        //3.将字典转成模型对象
        //        //4.请求用户信息
        //
        //        }
        
        let urlString = tockenURL
        //参数字典
        let parameters = ["client_id":client_id,"client_secret":client_secret,"grant_type":"authorization_code","code":code,"redirect_uri":redirect_uri]
        let AFN = AFHTTPSessionManager()
        //failed: unacceptable content-type: text/html  text/plain
        //AFN默认只支持以下几种数据格式的解析 @"application/json", @"text/json", @"text/javascript"
        // AFN可上传
         AFN.responseSerializer.acceptableContentTypes?.insert("text/plain")
//直接把AFN数据 全部转成NSData
//不指定AFN类型 默认返回NSData数据
// AFN.responseSerializer = AFHTTPResponseSerializer()

        //参数"_"表示忽略 参数自己命名 error信息一定要打印
        AFN.post(urlString, parameters: parameters, headers: nil, progress: { (progress) in
            
            
            }, success: { (_, result) in
               //将二进制数据转成 String
//                let str = NSString(data: result as! NSData, encoding: NSUTF8StringEncoding)
                
                
                print(result as Any)
                //网络数据 可能是数组 字典  需要校验 进入分支的一定是字典
                if let dict = result as? [String :AnyObject]{
                    //开始字典转模型
                    let account = FYUserAccount(dict: dict)
                    
                    print(account)
                    //                    let access_token = dict[""] as? String
                    //                    let uid = dict[""] as? String
                    //                    //闭包中调用方法 要用方法加self
                    //                    //参数一定有值  强制解包
                    //                    self.loadUserInfo(access_token!, uid: uid!)
                    self.loadUserInfo(account: account)
                }
        }) { (_, error) in
            print(error)
        }
        
        
        
    }
    /*
     //点击登录 加载拼接地址
     Optional(https://api.weibo.com/oauth2/authorize?client_id=1486450336&redirect_uri=http://www.itcast.cn)
     //点击登录 加载拼接地址
     Optional(https://api.weibo.com/oauth2/authorize?client_id=3977538491&redirect_uri=http://www.baidu.com)
     
     Optional(https://api.weibo.com/oauth2/authorize)
     Optional(https://api.weibo.com/oauth2/authorize#)
     Optional(https://api.weibo.com/oauth2/authorize)
     //加载成功后跳转页面  code 出现表示登录成功
     Optional(http://www.baidu.com/?code=f7dcbce5ec39c19a8e0c6f5ca9dd9aaa)不希望能够加载出来
     Optional(https://m.baidu.com/?code=f7dcbce5ec39c19a8e0c6f5ca9dd9aaa&from=844b&vit=fps)不希望能够加载出来
     */
    
    
    //请求用户信息
    //保存用户信息
    private func loadUserInfo(account : FYUserAccount ){
        let urlString = userURL
        let parmaters = ["access_token": account.access_token!, "uid": account.uid!]
        let AFN = AFHTTPSessionManager()
        AFN.get(urlString, parameters: parmaters, headers: nil, progress: { (progress) in
            //
            }, success: { (_, result) in
                if let dict = result as?[String : AnyObject]{
                    // AnyObject对象妆花为字符串
                    account.avatar_large = dict["avatar_large"] as? String
                    account.name = dict["name"] as? String
                    account.saveAccount()
                    
                }
            }) { (_, error) in
                //
                 print(error)
        }
        
   }
}
